home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / scsiDiskBoot / RCS / devSCSIDisk.c,v < prev    next >
Encoding:
Text File  |  1989-06-10  |  7.1 KB  |  301 lines

  1. head     1.4;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    mendel:1.4; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.4
  10. date     87.05.08.17.47.22;  author brent;  state Exp;
  11. branches ;
  12. next     1.3;
  13.  
  14. 1.3
  15. date     86.07.24.11.31.02;  author brent;  state Exp;
  16. branches ;
  17. next     1.2;
  18.  
  19. 1.2
  20. date     86.07.21.09.34.27;  author brent;  state Exp;
  21. branches ;
  22. next     1.1;
  23.  
  24. 1.1
  25. date     86.07.18.09.31.50;  author brent;  state Exp;
  26. branches ;
  27. next     ;
  28.  
  29.  
  30. desc
  31. @Block interface to the SCSI disk.
  32. @
  33.  
  34.  
  35. 1.4
  36. log
  37. @Fs_Geometry -> FsGeometry, added DevSCSIDiskError
  38. @
  39. text
  40. @/* 
  41.  * devSCSIDisk.c --
  42.  *
  43.  *    A sector oriented version of the SCSI device interface.
  44.  *    Only sector operations are defined
  45.  * All rights reserved.
  46.  */
  47.  
  48. #ifndef lint
  49. static char rcsid[] = "$Header: devSCSIDisk.c,v 1.3 86/07/24 11:31:02 brent Exp $ SPRITE (Berkeley)";
  50. #endif not lint
  51.  
  52.  
  53. #include "sprite.h"
  54. #include "fs.h"
  55. #include "fsDisk.h"
  56. #include "dev.h"
  57. #include "devInt.h"
  58. #include "devSCSI.h"
  59. #include "devSCSIDisk.h"
  60.  
  61. #define SECTORS_PER_FRAGMENT    (FS_FRAGMENT_SIZE / DEV_BYTES_PER_SECTOR)
  62.  
  63. /*
  64.  *----------------------------------------------------------------------
  65.  *
  66.  * Dev_SCSIDiskBlockIOInit --
  67.  *
  68.  *    Initialization routine for the Block I/O interface to the SCSI disk.
  69.  *
  70.  * Results:
  71.  *    SUCCESS.
  72.  *
  73.  * Side effects:
  74.  *    Saves a pointer to the geometry information for the ClientData
  75.  *    field of the Fs_Device object passed in.
  76.  *
  77.  *----------------------------------------------------------------------
  78.  */
  79. #ifdef notdef
  80. ReturnStatus
  81. Dev_SCSIDiskBlockIOInit(devicePtr, geometryPtr)
  82.     Fs_Device *devicePtr;    /* Use the unit number to specify partition */
  83.     FsGeometry *geometryPtr;    /* Specifies how filesystem blocks are layed
  84.                  * out on the disk */
  85. {
  86.     if (devicePtr->data != (ClientData)0) {
  87.     Sys_Panic(SYS_WARNING, "SCSI Block Init: non NIL device data");
  88.     return(FAILURE);
  89.     } else {
  90.     devicePtr->data = (ClientData)geometryPtr;
  91.     return(SUCCESS);
  92.     }
  93. }
  94. #endif
  95.  
  96. /*
  97.  *----------------------------------------------------------------------
  98.  *
  99.  * Dev_SCSIDiskBlockIO --
  100.  *
  101.  *    Do block I/O on the SCSI disk.  This uses the disk geometry
  102.  *    information to map from filesystem fragments indexes to filesystem
  103.  *    block indexes, and finally to disk sectors.
  104.  *
  105.  * Results:
  106.  *    The return code from the I/O operation.
  107.  *
  108.  * Side effects:
  109.  *    The disk write, if readWrite == FS_WRITE.
  110.  *
  111.  *----------------------------------------------------------------------
  112.  */
  113. ReturnStatus
  114. Dev_SCSIDiskBlockIO(readWrite, devicePtr, fragNumber, numFrags, buffer)
  115.     int readWrite;        /* FS_READ or FS_WRITE */
  116.     Fs_Device *devicePtr;    /* Use the unit number to specify partition */
  117.     register int fragNumber;    /* Index of first fragment to transfer*/
  118.     register int numFrags;    /* Number of fragments to transfer */
  119.     register Address buffer;    /* I/O buffer */
  120. {
  121.     register FsGeometry *geoPtr;/* Specifies how filesystem blocks are layed
  122.                  * out on the disk */
  123.     register ReturnStatus status;/* General return code */
  124.     register int firstSector;    /* Starting sector of transfer */
  125.     int numSectors;        /* Number of sectors to transfer */
  126.     register int length;
  127.  
  128.     geoPtr = (FsGeometry *)devicePtr->data;
  129.     if ((fragNumber % FS_FRAGMENTS_PER_BLOCK) != 0) {
  130.     /*
  131.      * The I/O doesn't start on a block boundary.  Transfer the
  132.      * first few extra fragments to get things going on a block boundary.
  133.      */
  134.     register int extraFrags;
  135.  
  136.     extraFrags = FS_FRAGMENTS_PER_BLOCK -
  137.             (fragNumber % FS_FRAGMENTS_PER_BLOCK);
  138.     if (extraFrags > numFrags) {
  139.         extraFrags = numFrags;
  140.     }
  141.     firstSector = Fs_BlocksToSectors(fragNumber, geoPtr);
  142.     numSectors = extraFrags * SECTORS_PER_FRAGMENT;
  143.     status = Dev_SCSIDiskIO(readWrite, devicePtr->unit, buffer, firstSector,
  144.                     &numSectors);
  145.     extraFrags = numSectors / SECTORS_PER_FRAGMENT;
  146.     fragNumber += extraFrags;
  147.     buffer += extraFrags * FS_FRAGMENT_SIZE;
  148.     numFrags -= extraFrags;
  149.     if (status != SUCCESS) {
  150.         return(status);
  151.     }
  152.     }
  153.     while (numFrags >= FS_FRAGMENTS_PER_BLOCK) {
  154.     /*
  155.      * Transfer whole blocks.
  156.      */
  157.     firstSector = Fs_BlocksToSectors(fragNumber, geoPtr);
  158.     numSectors = SECTORS_PER_FRAGMENT * FS_FRAGMENTS_PER_BLOCK;
  159.     status = Dev_SCSIDiskIO(readWrite, devicePtr->unit, buffer, firstSector,
  160.                     &numSectors);
  161.     fragNumber += FS_FRAGMENTS_PER_BLOCK;
  162.     buffer += FS_BLOCK_SIZE;
  163.     numFrags -= FS_FRAGMENTS_PER_BLOCK;
  164.     if (status != SUCCESS) {
  165.         return(status);
  166.     }
  167.     }
  168.     if (numFrags > 0) {
  169.     /*
  170.      * Transfer the left over fragments.
  171.      */
  172.     firstSector = Fs_BlocksToSectors(fragNumber, geoPtr);
  173.     numSectors = numFrags * SECTORS_PER_FRAGMENT;
  174.     status = Dev_SCSIDiskIO(readWrite, devicePtr->unit, buffer, firstSector,
  175.                     &numSectors);
  176.     }
  177.     return(status);
  178. }
  179.  
  180. /*
  181.  *----------------------------------------------------------------------
  182.  *
  183.  * DevSCSIDiskError --
  184.  *
  185.  *    Handle errors indicated by the sense data returned from the disk.
  186.  *
  187.  * Results:
  188.  *    None.
  189.  *
  190.  * Side effects:
  191.  *    None.
  192.  *
  193.  *----------------------------------------------------------------------
  194.  */
  195. ReturnStatus
  196. DevSCSIDiskError(devPtr, sensePtr)
  197.     DevSCSIDevice *devPtr;
  198.     DevSCSISense *sensePtr;
  199. {
  200.     if (sensePtr->error != SCSI_NO_SENSE_DATA) {
  201. #ifdef notdef
  202.     register int addr;
  203.     addr = (sensePtr->highAddr << 16) |
  204.         (sensePtr->midAddr << 8) |
  205.         sensePtr->lowAddr;
  206.     Sys_Printf("SCSI-%d: Sense error (%d-%d) at <%x> ",
  207.              devPtr->scsiPtr->number, class, code, addr);
  208.     if (scsiNumErrors[class] > code) {
  209.         Sys_Printf("%s", scsiErrors[class][code]);
  210.     }
  211.     Sys_Printf("\n");
  212. #else
  213.     register int class = (sensePtr->error & 0x70) >> 4;
  214.     register int code = sensePtr->error & 0xF;
  215.     Sys_Printf("Disk error (%d-%d)\n", class, code);
  216. #endif notdef
  217.  
  218.     return (DEV_INVALID_ARG);
  219.     } else {
  220.     return(SUCCESS);
  221.     }
  222. }
  223.  
  224. @
  225.  
  226.  
  227. 1.3
  228. log
  229. @trimming with register declarations (356 bytes to 296)
  230. @
  231. text
  232. @d10 1
  233. a10 1
  234. static char rcsid[] = "$Header: devSCSIDisk.c,v 1.2 86/07/21 09:34:27 brent Exp $ SPRITE (Berkeley)";
  235. d16 1
  236. d22 1
  237. a22 1
  238. #define SECTORS_PER_FRAGMENT    (FS_FRAGMENT_SIZE / BYTES_PER_SECTOR)
  239. d44 1
  240. a44 1
  241.     Fs_Geometry *geometryPtr;    /* Specifies how filesystem blocks are layed
  242. d82 1
  243. a82 1
  244.     register Fs_Geometry *geoPtr;/* Specifies how filesystem blocks are layed
  245. d89 1
  246. a89 1
  247.     geoPtr = (Fs_Geometry *)devicePtr->data;
  248. d104 1
  249. a104 1
  250.     status = Dev_SCSIIO(readWrite, devicePtr->unit, buffer, firstSector,
  251. d120 1
  252. a120 1
  253.     status = Dev_SCSIIO(readWrite, devicePtr->unit, buffer, firstSector,
  254. d135 1
  255. a135 1
  256.     status = Dev_SCSIIO(readWrite, devicePtr->unit, buffer, firstSector,
  257. d140 45
  258. @
  259.  
  260.  
  261. 1.2
  262. log
  263. @*** empty log message ***
  264. @
  265. text
  266. @d10 1
  267. a10 1
  268. static char rcsid[] = "$Header: devSCSIDisk.c,v 1.1 86/07/18 09:31:50 brent Exp $ SPRITE (Berkeley)";
  269. d77 3
  270. a79 3
  271.     int fragNumber;        /* Index of first fragment to transfer*/
  272.     int numFrags;        /* Number of fragments to transfer */
  273.     Address buffer;        /* I/O buffer */
  274. d81 1
  275. a81 1
  276.     Fs_Geometry *geoPtr;    /* Specifies how filesystem blocks are layed
  277. d83 2
  278. a84 2
  279.     ReturnStatus status;    /* General return code */
  280.     int firstSector;        /* Starting sector of transfer */
  281. d86 1
  282. a86 1
  283.     int length;
  284. @
  285.  
  286.  
  287. 1.1
  288. log
  289. @Initial revision
  290. @
  291. text
  292. @d10 1
  293. a10 1
  294. static char rcsid[] = "$Header: devSCSIDisk.c,v 1.4 86/07/07 10:54:42 brent Exp $ SPRITE (Berkeley)";
  295. d39 1
  296. d46 1
  297. a46 1
  298.     if (devicePtr->data != (ClientData)NIL) {
  299. d54 1
  300. @
  301.